#第11章 正则表达式
#! /usr/bin/python3
# -*- coding:UTF-8 -*-
import re
#re.match()只匹配字符串开始的字符，如果开始的字符串不符合正则表达式，就返回None
print('re.match(\'hello\',\'hello world\') = ',re.match('hello','hello world'))
#span()函数返回一个元组，表示匹配的区间，左闭又开
#起始位置匹配
print('re.match(\'hello\',\'hello world\').span() = ',re.match('hello','hello world').span())
#非起始位置匹配
print('re.match(\'world\',\'hello world\') = ',re.match('world','hello world'))

#re.search(),匹配整个字符串，直到找到一个匹配的对象，匹配结束后没有找到匹配值才返回None
#起始位置匹配
print('re.search(\'hello\',\'hello world\').span() = ',re.search('hello','hello world').span())
#非起始位置匹配
print('re.search(\'world\',\'hello world\').span() = ',re.search('world','hello world').span())

#在字符串前加前缀'r',是为了告诉编译器这个string是个raw string，r 代表的意思是: raw，不要转义 '\'
#raw string 有什么用处呢？ raw string 就是会自动将反斜杠转义。例如：print(r'\n')=\n
print('r\'abc\\n\' = ',r'abc\n')

print('---------RE模块示例-------------')
#RE模块示例
line = 'cats are smarter than dogs'
matchobj = re.match(r'dogs',line,re.M|re.I)
if matchobj:
    print('使用match，匹配的字符串是：',matchobj.group())
else:
    print('没有匹配项')
matchobj = re.search(r'dogs',line,re.M|re.I)
if matchobj:
    print('使用search，匹配的字符串是：',matchobj.group())
    print('第一个匹配的字符串是：',matchobj.group(0))
    #下面为什么是空？
    print('使用search，全部匹配的字符串是：',matchobj.groups())
    print('一共匹配了%s个元素' % len(matchobj.groups()))
    for matchstr in matchobj.groups():
        print('matchstr is ',matchstr)
else:
    print('没有匹配项')

print('----------贪婪非贪婪模式----------------')
#贪婪非贪婪模式
#贪婪模式
print(re.match(r'^(\d+)(0*)$','102300').groups())
#非贪婪模式
print(re.match(r'^(\d+?)(0*)$','102300').groups())
#贪婪模式,匹配尽可能多的字符
print(re.match(r'ab*','abbbbbc').span())
#非贪婪模式，匹配0到1个字符
print(re.match(r'ab*?','abbbbbc').span())

print('----------编译----------------')
telReg = re.compile(r'^(\d{3})-(\d{3,8})$')
print(telReg.match('010-1234567').groups())
def printTel(tels):
    i = 0
    for tel in telReg.match('010-1234567').groups():
        i += 1
        print('part%d of tel = %s' % (i, tel))


printTel(telReg.match('010-1234567').groups())
print(telReg.match('010-123').groups())

print('----------检索和替换----------------')
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
print('phone = ',re.sub(r'#.*$','',phone))
# 删除非数字(-)的字符串
print(r'删除非数字(-)的字符串后=',re.sub(r'\D','',phone))

print('----------repl 参数是一个函数----------------')
# 将匹配的数字乘以 2
def double(matched):
    value = int(matched.group('value'))
    print('value = ',value)
    return str(value * 2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))